home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Graphics Plus
/
Graphics Plus.iso
/
amiga
/
gui
/
prcgntn1.lha
/
Precognition
/
source
/
CycleGadget.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-12-23
|
8KB
|
325 lines
#include <stdio.h>
#include "CycleGadget.h"
#include "CycleGadgetClass.h"
#include "BoolGadgetClass.h"
#include "precognition.h"
#include "minmax.h"
#include "AmigaMem.h"
#include <proto/exec.h>
#include <proto/graphics.h>
#include <proto/intuition.h>
void CycleGadget_CleanUp( CycleGadget *self )
{
Afree( self->bg.BoxBorder->BottomRight.NextBorder );
self->bg.BoxBorder->BottomRight.NextBorder = NULL;
StringList_CleanUp( &self->sl );
}
Point CycleGadget_AskSize( CycleGadget *self,
PIXELS Width,
PIXELS Height )
{
Point size;
size.y = 14;
size.x = MAX( Width, 32 );
return size;
}
USHORT CycleGadget_ClaimEvent( CycleGadget *self,
IntuiMessage *event )
{
USHORT response = 0;
switch (event->Class)
{
case REFRESHWINDOW:
response = RESPONDED;
break;
case GADGETUP:
if (event->IAddress == (void*) &self->bg.g)
{
response = RESPONDED | CONSUMED_EVENT | CHANGED_STATE;
}
break;
}
return response;
}
LONG CycleGadget_Value( CycleGadget *self )
{
return (LONG) self->bg.state;
}
LONG CycleGadget_SetValue( CycleGadget *self,
LONG selection )
{
USHORT s;
s = MIN( selection, self->sl.nEntries );
s = MAX( s, 0 );
self->bg.state = s;
Forbid();
self->Format.IText = self->sl.Entries[s];
Permit();
return (LONG) s;
}
void CycleGadget_Render( CycleGadget *self,
RastPort *RPort )
{
PIXELS xmin, xmax, ymin, ymax;
xmin = self->bg.Location.x + 2;
ymin = self->bg.Location.y + 2;
xmax = xmin + self->bg.Size.x - 4;
ymax = ymin + self->bg.Size.y - 4;
SetAPen( RPort, self->bg.Pens.BackPen );
SetDrMd( RPort, JAM1 );
RectFill( RPort, xmin, ymin, xmax, ymax );
EmbossedGadget_Render( &self->bg, RPort );
}
USHORT CycleGadget_Respond( CycleGadget *self,
IntuiMessage *event )
{
USHORT response = 0;
Window *window;
USHORT selection;
switch (event->Class)
{
case REFRESHWINDOW:
response = RESPONDED;
break;
case GADGETUP:
if (event->IAddress == (void*) &self->bg.g)
{
window = event->IDCMPWindow;
selection = self->bg.state + 1;
if (selection == self->sl.nEntries)
selection = 0;
SetValue( self, selection );
Render( self, window->RPort );
response = RESPONDED | CONSUMED_EVENT | CHANGED_STATE;
}
break;
}
return response;
}
#ifdef BUILDER
#include "BuilderMethods.h"
#include "GraphicObject_Builder.h"
#include "CycleGadget_builder.h"
#include "CycleGadget_coder.h"
#include <string.h>
CycleGadget *CycleGadget_New( CycleGadget *self )
{
CycleGadget *cycle = NULL;
USHORT i;
char **choices;
if (cycle = (CycleGadget *) Amalloc(sizeof(CycleGadget)))
{
StringList *sl;
sl = &(self->sl);
choices = (char**) Acalloc( sizeof(char*), sl->nEntries+1 );
for (i=0; i<sl->nEntries; i++)
{
choices[i] = sl->Entries[i];
}
choices[sl->nEntries] = NULL;
CycleGadget_Init( cycle,
self->bg.Location.x, self->bg.Location.y,
self->bg.Size.x, self->bg.Pens,
Title(self), choices );
GiveItAName( cycle );
Afree(choices);
}
return cycle;
}
struct BuilderMethods CycleGadget_bm;
#endif
BOOL CycleGadget_elaborated = FALSE;
struct ValuatorClass CycleGadget_Class;
void CycleGadgetClass_Init( struct ValuatorClass *class )
{
BoolGadgetClass_Init( class );
class->isa = BoolGadgetClass();
class->ClassName = "CycleGadget";
/* -------- Commented-out methods are inherited ----------------*/
class->CleanUp = CycleGadget_CleanUp;
class->AskSize = CycleGadget_AskSize;
class->SizeFlags = GraphicObject_SizeFlagsX;
class->Render = CycleGadget_Render;
class->ClaimEvent = CycleGadget_ClaimEvent;
class->Respond = CycleGadget_Respond;
class->Value = CycleGadget_Value;
class->SetValue = CycleGadget_SetValue;
/* class->SetTitle = EmbossedGadget_SetTitle;*/
#ifdef BUILDER
go_InitBuilderMethods( &CycleGadget_bm );
class->BuilderMethods = &CycleGadget_bm;
CycleGadget_bm.New = CycleGadget_New;
CycleGadget_bm.PropEdit = CycleGadget_PropEdit;
CycleGadget_bm.WriteCode = CycleGadget_WriteCode;
#endif
}
struct ValuatorClass *CycleGadgetClass( void )
{
if (! CycleGadget_elaborated)
{
CycleGadgetClass_Init( &CycleGadget_Class );
CycleGadget_elaborated = TRUE;
}
return &CycleGadget_Class;
}
WORD Cycle_BrightLinePoints[] = { 15,1, 15,12 };
WORD Cycle_DarkLinePoints[] = { 14,1, 14,12 };
WORD Cycle_ArrowPoints[] =
{ 10,3, 10, 7, 12,5, 7,5, 9,7, 9,2, 5,2,
4,3, 4,10, 5,3, 5,11, 9,11, 9,10, 10,10 };
typedef struct CycleBorder
{
Border BrightLine;
Border DarkLine;
Border Arrow;
} CycleBorder;
CycleBorder *CycleBorder_New( pcg_3DPens Pens )
{
CycleBorder *border;
border = (CycleBorder *) Acalloc( 1, sizeof(CycleBorder) );
border->BrightLine.LeftEdge = 0;
border->BrightLine.TopEdge = 0;
border->BrightLine.FrontPen = Pens.BrightPen;
border->BrightLine.BackPen = Pens.BackPen;
border->BrightLine.DrawMode = JAM1;
border->BrightLine.Count = 2;
border->BrightLine.XY = Cycle_BrightLinePoints;
border->BrightLine.NextBorder = &border->DarkLine;
border->DarkLine.LeftEdge = 0;
border->DarkLine.TopEdge = 0;
border->DarkLine.FrontPen = Pens.DarkPen;
border->DarkLine.BackPen = Pens.BackPen;
border->DarkLine.DrawMode = JAM1;
border->DarkLine.Count = 2;
border->DarkLine.XY = Cycle_DarkLinePoints;
border->DarkLine.NextBorder = &border->Arrow;
border->Arrow.LeftEdge = 0;
border->Arrow.TopEdge = 0;
border->Arrow.FrontPen = Pens.FrontPen;
border->Arrow.BackPen = Pens.BackPen;
border->Arrow.DrawMode = JAM1;
border->Arrow.Count = 14;
border->Arrow.XY = Cycle_ArrowPoints;
border->Arrow.NextBorder = NULL;
return border;
}
void CycleGadget_Init( CycleGadget *self,
PIXELS LeftEdge,
PIXELS TopEdge,
PIXELS Width,
pcg_3DPens Pens,
char *label,
char **Choices )
{
Point size;
AlignInfo ainfo;
self->bg.isa = CycleGadgetClass();
size = AskSize( self, Width, 0 );
BoolGadget_Init( &self->bg, LeftEdge, TopEdge, size.x, size.y,
Pens, NULL );
ainfo = TextAlignment(self);
SetTextAlignment( self, tx_OUTSIDE | tx_LEFT | tx_YCENTER,
ainfo.Xpad, ainfo.Ypad );
self->bg.isa = CycleGadgetClass();
self->bg.g.Flags = GADGHCOMP;
self->bg.BoxBorder->BottomRight.NextBorder =
(Border *) CycleBorder_New(Pens);
StringList_Init( &self->sl, FALSE );
self->bg.state = 0;
self->bg.LabelText.NextText = &self->Format;
self->Format.FrontPen = Pens.FrontPen;
self->Format.BackPen = Pens.BackPen;
self->Format.DrawMode = JAM1;
self->Format.LeftEdge = 20;
self->Format.TopEdge = 3;
self->Format.ITextFont = &pcg_Topaz80;
self->Format.IText = (Choices ? Choices[0] : NULL);
self->Format.NextText = NULL;
if (Choices)
StringList_AddStrings( &self->sl, Choices, 0 );
SetTitle( self, label );
}